home *** CD-ROM | disk | FTP | other *** search
/ Aminet 22 / Aminet 22 (1997)(GTI - Schatztruhe)[!][Dec 1997].iso / Aminet / comm / maxs / funlock.lha / funlock.asm < prev    next >
Assembly Source File  |  1997-10-13  |  15KB  |  465 lines

  1. ; ***** FUNLOCK V1.0.
  2. ; ***** Filebase unlocker/locker for MAXsBBS.
  3. ; Ram:
  4. ;     0  20200  buffer for 100 file.data records
  5. ; 20200   4400  buffer for 100 file.index records
  6. ; 20300    100  sections ram
  7. ; 20500    200  print buffer
  8. ; 20700
  9.  
  10. ; get some library offsets
  11.  
  12.            include "Assempro:Includes/exec.offsets"
  13.            include "Assempro:Includes/dos.offsets"
  14.  
  15. PR_CLI     equ     172
  16. PR_MsgPort equ     92
  17. mode_new   equ     1006
  18. mode_old   equ     1005
  19.  
  20. callsys:   macro   $\1                   ;macro for exec lib calls
  21.            jsr     _LVO\1(a6)
  22.            endm
  23. calldos:   macro   $\1                   ;macro for dos lib calls
  24.            move.l  doslibbase(pc),a6
  25.            jsr     _LVO\1(a6)
  26.            move.l  4,a6
  27.            endm
  28.  
  29. ; Vanity embedding
  30.  
  31.            bra     startup
  32.            dc.b    "FunLock V1.0 by Keith Bennett 10-Mar-1997",0
  33.            align
  34.  
  35. ; Start up code
  36.  
  37. startup:   move.l  sp,InitialSP          ;store stack pointer
  38.            move.l  d0,d6                 ;remember command length
  39.            move.l  a0,a5                 ;remember command buffer
  40.            move.l  4,a6                  ;point a6 to execbase
  41.            sub.l   a1,a1                 ;what task am I?
  42.            callsys findtask
  43.            move.l  d0,Own_Task
  44.            move.l  d0,a4
  45.            tst.l   PR_CLI(a4)            ;start from CLI?
  46.            bne.s   begin                 ;yes, that's good
  47.            lea     PR_MsgPort(a4),a0     ;wait for WB's go-ahead
  48.            callsys waitport
  49.            lea     PR_MsgPort(a4),a0     ;grab WB's message
  50.            callsys getmsg
  51.            move.l  d0,WBenchMsg
  52.            bra     exit                  ;can't run from WB
  53.  
  54. ; Start of program
  55.  
  56. begin:     lea     doslibname,a1         ;open dos lib
  57.            sub.l   d0,d0
  58.            callsys openlibrary
  59.            move.l  d0,doslibbase
  60.            beq     exit
  61.            calldos output                ;get output channel
  62.            move.l  d0,outbase
  63.  
  64.            subq.l  #1,d6                 ;any parameters?
  65.            beq     error1
  66.            move.b  #0,(a5,d6)            ;terminate parameters
  67.            move.l  a5,path
  68.  
  69.            move.l  #20200+4400+100+200,d0;get sections & file buffer ram
  70.            move.l  #$10000,d1            ;clear ram
  71.            callsys allocmem
  72.            move.l  d0,sectionram
  73.            beq     error2
  74.            move.l  d0,a5
  75.  
  76.            move.l  path(PC),a0           ;point to parameters
  77. \loop1:    move.b  (a0)+,d0              ;scan for a space
  78.            beq     error1
  79.            cmp.b   #" ",d0
  80.            bne     \loop1
  81.            move.b  #0,-1(a0)             ;terminate path name
  82.  
  83. ploop:     move.b  (a0)+,d0
  84.            and.b   #$df,d0
  85.            move.b  #1,d7
  86.            cmp.b   #"L",d0
  87.            beq     ploop1
  88.            move.b  #2,d7
  89.            cmp.b   #"U",d0
  90.            bne     error8
  91.  
  92. ploop1:    bsr     readnum               ;read selections
  93.            tst.l   d0
  94.            bmi     error8
  95.            move.l  d0,d1
  96.            bsr     setsect
  97. ploop3:    move.b  (a0)+,d1
  98.            beq     contin
  99.            cmp.b   #" ",d1
  100.            beq     ploop
  101.            cmp.b   #",",d1
  102.            beq     ploop1
  103.            cmp.b   #"-",d1
  104.            bne     error8
  105.            move.l  d0,d3
  106.            bsr     readnum
  107.            tst.l   d0
  108.            bmi     error8
  109.            cmp.b   d0,d3
  110.            blo     ploop2
  111.            exg     d0,d3
  112. ploop2:    cmp.b   d0,d3
  113.            bhi     ploop3
  114.            move.l  d3,d1
  115.            bsr     setsect
  116.            addq    #1,d3
  117.            bra     ploop2
  118. readnum:   clr.l   d0
  119.            clr.l   d1
  120.            move.b  1(a0),d0
  121.            cmp.b   #"0",d0
  122.            blo     \skip1
  123.            cmp.b   #"9",d0
  124.            bhi     \skip1
  125.            move.b  (a0)+,d1
  126.            cmp.b   #"0",d1
  127.            blo     \skip2
  128.            cmp.b   #"9",d1
  129.            bhi     \skip2
  130.            sub.b   #$30,d1
  131.            mulu    #10,d1
  132. \skip1:    move.b  (a0)+,d0
  133.            cmp.b   #"0",d0
  134.            blo     \skip2
  135.            cmp.b   #"9",d0
  136.            bhi     \skip2
  137.            sub.b   #$30,d0
  138.            add.b   d1,d0
  139.            rts
  140. \skip2:    moveq.l #-1,d0
  141.            rts
  142. setsect:   lea     20200+4400(a5),a1
  143.            add.l   d1,a1
  144.            move.b  d7,(a1)
  145.            rts
  146.  
  147. contin:    lea     efdname(PC),a0        ;open file.data
  148.            move.l  #mode_old,d2
  149.            bsr     openfile
  150.            move.l  d0,efdbase
  151.            beq     error3
  152.            move.l  d0,d1                 ;read header
  153.            move.l  a5,d2
  154.            move.l  #466,d3
  155.            calldos read
  156.            cmp.l   #466,d0
  157.            bne     error4
  158.  
  159.            lea     txt01(PC),a0
  160.            bsr     print
  161.            lea     20200+4400+100(a5),a0
  162.            bsr     print
  163.  
  164.            lea     tfdname(PC),a0        ;open file.data.temp
  165.            move.l  #mode_new,d2
  166.            bsr     openfile
  167.            move.l  d0,tfdbase
  168.            beq     error3
  169.            move.l  d0,d1                 ;write header
  170.            move.l  a5,d2
  171.            move.l  #466,d3
  172.            calldos write
  173.            tst.l   d0
  174.            bmi     error5
  175.  
  176.            lea     efiname(PC),a0        ;open file.index
  177.            move.l  #mode_old,d2
  178.            bsr     openfile
  179.            move.l  d0,efibase
  180.            beq     error3
  181.            move.l  d0,d1                 ;read header
  182.            move.l  a5,d2
  183.            move.l  #62,d3
  184.            calldos read
  185.            cmp.l   #62,d0
  186.            bne     error4
  187.  
  188.            lea     tfiname(PC),a0        ;open file.index.temp
  189.            move.l  #mode_new,d2
  190.            bsr     openfile
  191.            move.l  d0,tfibase
  192.            beq     error3
  193.            move.l  d0,d1                 ;write header
  194.            move.l  a5,d2
  195.            moveq.l #62,d3
  196.            calldos write
  197.            tst.l   d0
  198.            bmi     error5
  199.            clr.l   d6                    ;record count
  200.            clr.l   d7                    ;modified record count
  201.  
  202. bloop:     move.l  efdbase(PC),d1        ;read up to 100 file records
  203.            move.l  a5,a3
  204.            move.l  a3,d2
  205.            move.l  #20200,d3
  206.            calldos read
  207.            move.l  d0,d5
  208.            move.l  d0,readsize
  209.            beq     eofiles
  210.            bmi     error4
  211.            move.l  efibase(PC),d1
  212.            lea     20200(a3),a4
  213.            move.l  a4,d2
  214.            move.l  #4400,d3
  215.            calldos read
  216.            tst.l   d0
  217.            bmi     error4
  218.  
  219. mloop:     addq.l  #1,d6                 ;increment total record count
  220.            clr.l   d0
  221.            move.b  17(a3),d0             ;get section number
  222.            lea     20200+4400(a5),a1     ;read selection for section
  223.            add.l   d0,a1
  224.            move.b  (a1),d0
  225.            beq     nextfile           
  226.            move.b  16(a3),d1
  227.            cmp.b   #1,d0                 ;lock record
  228.            bne     \skip1
  229.            or.b    #$02,d1
  230. \skip1:    cmp.b   #2,d0                 ;unlock record
  231.            bne     \skip2
  232.            and.b   #$fd,d1           
  233. \skip2:    move.b  d1,16(a3)             ;update file.data flags
  234.            move.b  d1,42(a4)             ;update file.index flags
  235.            addq.l  #1,d7
  236.  
  237. nextfile:  add.w   #202,a3
  238.            add.w   #44,a4
  239.            sub.l   #202,d5
  240.            bhi     mloop
  241.  
  242. writeb:    move.l  tfdbase(PC),d1        ;write temp file.data
  243.            move.l  a5,d2
  244.            move.l  readsize(PC),d3
  245.            move.l  d3,d4
  246.            calldos write
  247.            cmp.l   d0,d4
  248.            bne     error5
  249.            move.l  tfibase(PC),d1        ;write temp file.index
  250.            lea     20200(a5),a0
  251.            move.l  a0,d2
  252.            move.l  readsize,d3
  253.            divu    #202,d3
  254.            mulu    #44,d3
  255.            move.l  d3,d4
  256.            calldos write
  257.            cmp.l   d0,d4
  258.            bne     error5
  259.            bra     bloop
  260.  
  261. eofiles:   bsr     fclose                ;close files
  262.            lea     rfdname(PC),a0        ;rename files
  263.            lea     20200+4400+100(a5),a2
  264.            bsr     getname
  265.            move.l  d1,d2
  266.            lea     efdname(PC),a0
  267.            lea     20200+4400+200(a5),a2
  268.            bsr     getname
  269.            calldos rename
  270.            tst.l   d0
  271.            beq     error6
  272.            lea     rfiname(PC),a0
  273.            lea     20200+4400+100(a5),a2
  274.            bsr     getname
  275.            move.l  d1,d2
  276.            lea     efiname(PC),a0
  277.            lea     20200+4400+200(a5),a2
  278.            bsr     getname
  279.            calldos rename
  280.            tst.l   d0
  281.            beq     error6
  282.            lea     efdname(PC),a0
  283.            lea     20200+4400+100(a5),a2
  284.            bsr     getname
  285.            move.l  d1,d2
  286.            lea     tfdname(PC),a0
  287.            lea     20200+4400+200(a5),a2
  288.            bsr     getname
  289.            calldos rename
  290.            tst.l   d0
  291.            beq     error6
  292.            lea     efiname(PC),a0
  293.            lea     20200+4400+100(a5),a2
  294.            bsr     getname
  295.            move.l  d1,d2
  296.            lea     tfiname(PC),a0
  297.            lea     20200+4400+200(a5),a2
  298.            bsr     getname
  299.            calldos rename
  300.            tst.l   d0
  301.            beq     error6
  302.  
  303.            lea     txt02(PC),a0          ;end text
  304.            move.l  d7,d0
  305.            bsr     printf
  306.            lea     txt03(PC),a0
  307.            move.l  d6,d0
  308.            bsr     printf
  309.            bra     exit
  310.  
  311. ; Error Handling
  312.  
  313. error1:    lea     txterr1(PC),a0
  314.            bra     error9
  315. error2:    lea     txterr2(PC),a0
  316.            bra     error9
  317. error3:    lea     txterr3(PC),a0
  318.            bsr     print
  319.            lea     20200+4400+100(a5),a0
  320.            bra     error9
  321. error4:    lea     txterr4(PC),a0
  322.            bra     error9
  323. error5:    lea     txterr5(PC),a0
  324.            bra     error9
  325. error6:    lea     txterr6(PC),a0
  326.            bsr     print
  327.            lea     20200+4400+200(a5),a0
  328.            bsr     print
  329.            lea     txterr7(PC),a0
  330.            bsr     print
  331.            lea     20200+4400+100(a5),a0
  332.            bra     error9
  333. error8:    lea     txterr8(PC),a0
  334.            bsr     print
  335.            lea     txterr1(PC),a0
  336. error9:    bsr     print
  337.            lea     txterr9(PC),a0
  338.            bsr     print
  339.  
  340. ; cleanup and exit
  341.  
  342. exit:      bsr     cleanup               ;close anything open
  343.            tst.l   WBenchMsg             ;did we start from WB?
  344.            beq.s   nowb                  ;nope
  345.            callsys forbid                ;stop task switching
  346.            move.l  WBenchMsg,a1          ;reply to WB's message
  347.            callsys replymsg
  348. nowb:      moveq   #0,d0                 ;clear error code
  349.            move.l  InitialSP,sp          ;restore stack pointer
  350.            rts                           ;and end
  351.  
  352. ; close everything that's open
  353.  
  354. cleanup:   bsr     fclose                ;close files
  355.            move.l  sectionram(PC),a1     ;free sections ram
  356.            move.l  a1,d0
  357.            beq     \closedos
  358.            move.l  #20200+4400+100+200,d0
  359.            callsys freemem
  360. \closedos: move.l  doslibbase,a1         ;get dos lib base
  361.            move.l  a1,d0                 ;test for zero
  362.            beq.s   \skip                 ;is it open?   
  363.            callsys closelibrary          ;close if open
  364. \skip:     rts
  365.  
  366. fclose:    move.l  efdbase,d1            ;close file.data
  367.            beq     \skip1
  368.            calldos close
  369.            clr.l   efdbase
  370. \skip1:    move.l  tfdbase,d1            ;close file.data.temp
  371.            beq     \skip2
  372.            calldos close
  373.            clr.l   tfdbase
  374. \skip2:    move.l  tfibase,d1            ;close file.index.temp
  375.            beq     \skip3
  376.            calldos close
  377.            clr.l   tfibase
  378. \skip3:    move.l  efibase,d1            ;close file.index
  379.            beq     \skip4
  380.            calldos close
  381.            clr.l   efibase
  382. \skip4:    rts
  383.  
  384. ;open file (a0)=file, d2=mode
  385.  
  386. openfile:  lea     20200+4400+100(a5),a2
  387.            bsr     getname
  388.            calldos open
  389.            rts
  390.  
  391. getname:   move.l  a2,d1                 ;get filename - a2
  392.            move.l  path(PC),a1
  393. \loop1:    move.b  (a1)+,(a2)+
  394.            bne     \loop1
  395.            subq.l  #1,a2
  396. \loop2:    move.b  (a0)+,(a2)+
  397.            bne     \loop2
  398.            rts
  399.  
  400. ; printf (a0), d0=data
  401.  
  402. printf:    movem.l a2/a3,-(SP)
  403.            lea     schar(PC),a2
  404.            lea     20200+4400+100(a5),a3
  405.            lea     temp(PC),a1
  406.            move.l  d0,(a1)
  407.            callsys rawdofmt
  408.            lea     20200+4400+100(a5),a0
  409.            bsr     print
  410.            movem.l (SP)+,a2/a3
  411.            rts
  412. schar:     move.b  d0,(a3)+
  413.            rts
  414.  
  415. ; print (a0)
  416.  
  417. print:     movem.l a1/d2/d3,-(SP)
  418.            move.l  outbase(PC),d1        ;get o/p channel
  419.            beq     \skip
  420.            move.l  a0,a1
  421. \loop:     tst.b   (a1)+
  422.            bne     \loop
  423.            move.l  a0,d2
  424.            move.l  a1,d3
  425.            sub.l   d2,d3
  426.            calldos write
  427. \skip:     movem.l (SP)+,a1/d2/d3
  428.            rts
  429.  
  430. WBenchMsg: dc.l    0                     ;pointer to WB's message
  431. Own_Task:  dc.l    0                     ;task structure pointer
  432. InitialSP: dc.l    0                     ;stack pointer store
  433. sectionram:dc.l    0                     ;sections data pointer
  434. outbase:   dc.l    0                     ;standard output channel
  435. doslibbase:dc.l    0                     ;dos lib base
  436. path:      dc.l    0                     ;pointer to path
  437. efdbase:   dc.l    0                     ;file.data base
  438. efibase:   dc.l    0                     ;file.index base
  439. tfdbase:   dc.l    0                     ;temp file.data base
  440. tfibase:   dc.l    0                     ;temp file.index base
  441. readsize:  dc.l    0                     ;file read size
  442. temp:      dc.l    0
  443. txterr1:   dc.b    10,"Usage: funlock <path to MAXs filebase> <sections list>",10
  444.            dc.b    "Eg:    funlock bbs:files/ l20-28 u4,32",0
  445. txterr2:   dc.b    10,"Error allocating RAM.",0
  446. txterr3:   dc.b    10,"Error opening ",0
  447. txterr4:   dc.b    10,"Read error",0
  448. txterr5:   dc.b    10,"Write error",0
  449. txterr6:   dc.b    10,"Error renaming ",0
  450. txterr7:   dc.b    " to ",0
  451. txterr8:   dc.b    10,"Bad parameters",0
  452. txterr9:   dc.b    10,10,0
  453. txt01:     dc.b    10,"Modifying: ",0
  454. txt02:     dc.b    10,"Complete.    Total records modified: %ld",0
  455. txt03:     dc.b    10,"          Total records in filebase: %ld",10,10,0
  456. doslibname:dc.b    "dos.library",0
  457. efdname:   dc.b    "File.data",0
  458. efiname:   dc.b    "File.index",0
  459. tfdname:   dc.b    "File.data.temp",0
  460. tfiname:   dc.b    "File.index.temp",0
  461. rfdname:   dc.b    "File.data.old",0
  462. rfiname:   dc.b    "File.index.old",0
  463.  
  464.            end
  465.